diff options
Diffstat (limited to 'cgthumb2was.c')
-rw-r--r-- | cgthumb2was.c | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/cgthumb2was.c b/cgthumb2was.c index f24a314..8171603 100644 --- a/cgthumb2was.c +++ b/cgthumb2was.c @@ -1558,11 +1558,24 @@ void w_as_jmpp_instruction (struct instruction *instruction) #endif } -static void w_as_branch_instruction (struct instruction *instruction,char *opcode) +static void w_as_branch_instruction (struct instruction *instruction,char *opcode,char *condition) { - w_as_opcode (opcode); - w_as_label_parameter (&instruction->instruction_parameters[0]); - w_as_newline_after_instruction(); + if (instruction->instruction_parameters[0].parameter_data.l->label_flags & FAR_CONDITIONAL_JUMP_LABEL) + { + w_as_opcode ("ldr"); + w_as_scratch_register_comma(); + w_as_immediate_label (instruction->instruction_parameters[0].parameter_data.l); + w_as_newline_after_instruction(); + + w_as_opcode_condition ("bx",condition,1); + w_as_scratch_register_newline(); + } + else + { + w_as_opcode_condition (opcode,condition,0); + w_as_label_parameter (&instruction->instruction_parameters[0]); + w_as_newline_after_instruction(); + } } static void as_test_floating_point_condition_code (void) @@ -2539,40 +2552,40 @@ static void w_as_instructions (struct instruction *instruction) w_as_rtsp_instruction(); break; case IBEQ: - w_as_branch_instruction (instruction,"beq"); + w_as_branch_instruction (instruction,"b","eq"); break; case IBGE: - w_as_branch_instruction (instruction,"bge"); + w_as_branch_instruction (instruction,"b","ge"); break; case IBGEU: - w_as_branch_instruction (instruction,"bhs"); + w_as_branch_instruction (instruction,"b","hs"); break; case IBGT: - w_as_branch_instruction (instruction,"bgt"); + w_as_branch_instruction (instruction,"b","gt"); break; case IBGTU: - w_as_branch_instruction (instruction,"bhi"); + w_as_branch_instruction (instruction,"b","hi"); break; case IBLE: - w_as_branch_instruction (instruction,"ble"); + w_as_branch_instruction (instruction,"b","le"); break; case IBLEU: - w_as_branch_instruction (instruction,"bls"); + w_as_branch_instruction (instruction,"b","ls"); break; case IBLT: - w_as_branch_instruction (instruction,"blt"); + w_as_branch_instruction (instruction,"b","lt"); break; case IBLTU: - w_as_branch_instruction (instruction,"blo"); + w_as_branch_instruction (instruction,"b","lo"); break; case IBNE: - w_as_branch_instruction (instruction,"bne"); + w_as_branch_instruction (instruction,"b","ne"); break; case IBO: - w_as_branch_instruction (instruction,"bvs"); + w_as_branch_instruction (instruction,"b","vs"); break; case IBNO: - w_as_branch_instruction (instruction,"bvc"); + w_as_branch_instruction (instruction,"b","vc"); break; case ILSL: w_as_shift_instruction (instruction,"lsl"); |