summaryrefslogtreecommitdiff
path: root/cgthumb2was.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgthumb2was.c')
-rw-r--r--cgthumb2was.c45
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");