diff options
author | Camil Staps | 2016-12-01 16:10:11 +0000 |
---|---|---|
committer | Camil Staps | 2016-12-01 16:10:11 +0000 |
commit | 7c22910c9a8285a80f5568ebc19a1be3d5a9c817 (patch) | |
tree | 6c8e56ac80c9915f7d4c93ee6aa77182b60a6de5 | |
parent | Some code style improvements (diff) |
Fix some illegal uses of sp
-rw-r--r-- | cgthumb2was.c | 28 |
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"); } |