summaryrefslogtreecommitdiff
path: root/cgthumb2was.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgthumb2was.c')
-rw-r--r--cgthumb2was.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/cgthumb2was.c b/cgthumb2was.c
index e0fbb15..f24a314 100644
--- a/cgthumb2was.c
+++ b/cgthumb2was.c
@@ -653,6 +653,11 @@ static void w_as_scratch_register_comma (void)
w_as_register_comma (REGISTER_S0);
}
+static void w_as_scratch_register_newline (void)
+{
+ w_as_register_newline (REGISTER_S0);
+}
+
static void w_as_comma_scratch_register (void)
{
w_as_comma_register (REGISTER_S0);
@@ -1185,7 +1190,14 @@ static void w_as_movem_instruction (struct instruction *instruction)
static void w_as_lea_instruction (struct instruction *instruction)
{
+ int mov_to_sp=0;
+
if (instruction->instruction_parameters[1].parameter_type==P_REGISTER){
+ if (instruction->instruction_parameters[1].parameter_data.reg.r==B_STACK_POINTER) {
+ instruction->instruction_parameters[1].parameter_data.reg.r=REGISTER_S0;
+ mov_to_sp=1;
+ }
+
switch (instruction->instruction_parameters[0].parameter_type){
case P_INDIRECT:
w_as_opcode ("add");
@@ -1193,16 +1205,16 @@ static void w_as_lea_instruction (struct instruction *instruction)
w_as_register_comma (instruction->instruction_parameters[0].parameter_data.reg.r);
fprintf (assembly_file,"#%d",instruction->instruction_parameters[0].parameter_offset);
w_as_newline_after_instruction();
- return;
+ break;
case P_INDEXED:
if (instruction->instruction_parameters[0].parameter_offset==0){
w_as_opcode ("add");
w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r);
w_as_register_comma (instruction->instruction_parameters[0].parameter_data.ir->a_reg.r);
w_as_register_newline (instruction->instruction_parameters[0].parameter_data.ir->d_reg.r);
- return;
+ break;
}
- break;
+ internal_error_in_function ("w_as_lea_instruction");
case P_LABEL:
if (instruction_n_after_ltorg+MAX_LITERAL_INSTRUCTION_OFFSET < ltorg_at_instruction_n)
ltorg_at_instruction_n = instruction_n_after_ltorg+MAX_LITERAL_INSTRUCTION_OFFSET;
@@ -1218,8 +1230,16 @@ static void w_as_lea_instruction (struct instruction *instruction)
fprintf (assembly_file,offset>=0 ? "+%d" : "%d",offset);
}
w_as_newline_after_instruction();
- return;
+ break;
}
+
+ if (mov_to_sp) {
+ w_as_opcode ("mov");
+ w_as_register_comma (B_STACK_POINTER);
+ w_as_scratch_register_newline();
+ }
+
+ return;
}
internal_error_in_function ("w_as_lea_instruction");
}