/* tc-mcore.c -- Assemble code for M*Core
- Copyright 1999, 2000 Free Software Foundation, Inc.
+ Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
#define UNCD_JUMP 2
#define UNDEF_DISP 0
-#define COND12 1
-#define COND32 2
-#define UNCD12 1
-#define UNCD32 2
-#define UNDEF_WORD_DISP 4
-#define END 5
+#define DISP12 1
+#define DISP32 2
+#define UNDEF_WORD_DISP 3
#define C12_LEN 2
#define C32_LEN 10 /* allow for align */
{ 1, 1, 0, 0 }, /* 2: unused */
{ 1, 1, 0, 0 }, /* 3: unused */
{ 1, 1, 0, 0 }, /* 4: unused */
-{ 2048, -2046, C12_LEN, C(COND_JUMP, COND32) }, /* 5: C(COND_JUMP, COND12) */
-{ 0, 0, C32_LEN, 0 }, /* 6: C(COND_JUMP, COND32) */
+{ 2048, -2046, C12_LEN, C(COND_JUMP, DISP32) }, /* 5: C(COND_JUMP, DISP12) */
+{ 0, 0, C32_LEN, 0 }, /* 6: C(COND_JUMP, DISP32) */
{ 1, 1, 0, 0 }, /* 7: unused */
{ 1, 1, 0, 0 }, /* 8: unused */
-{ 2048, -2046, U12_LEN, C(UNCD_JUMP, UNCD32) }, /* 9: C(UNCD_JUMP, UNCD12) */
-{ 0, 0, U32_LEN, 0 }, /*10: C(UNCD_JUMP, UNCD32) */
+{ 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) }, /* 9: C(UNCD_JUMP, DISP12) */
+{ 0, 0, U32_LEN, 0 }, /*10: C(UNCD_JUMP, DISP32) */
{ 1, 1, 0, 0 }, /*11: unused */
-{ 0, 0, 0, 0 } /*12: unused */
};
/* Literal pool data structures. */
symbol_table_insert (brarsym);
output = frag_var (rs_machine_dependent,
- md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length,
- md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length,
+ md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
+ md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
C (UNCD_JUMP, 0), brarsym, 0, 0);
output[0] = INST_BYTE0 (MCORE_INST_BR); /* br .+xxx */
output[1] = INST_BYTE1 (MCORE_INST_BR);
op_end = input_line_pointer;
output = frag_var (rs_machine_dependent,
- md_relax_table[C (COND_JUMP, COND32)].rlx_length,
- md_relax_table[C (COND_JUMP, COND12)].rlx_length,
+ md_relax_table[C (COND_JUMP, DISP32)].rlx_length,
+ md_relax_table[C (COND_JUMP, DISP12)].rlx_length,
C (COND_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
isize = C32_LEN;
break;
op_end = input_line_pointer;
output = frag_var (rs_machine_dependent,
- md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length,
- md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length,
+ md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
+ md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
C (UNCD_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
isize = U32_LEN;
break;
switch (fragP->fr_subtype)
{
- case C (COND_JUMP, COND12):
- case C (UNCD_JUMP, UNCD12):
+ case C (COND_JUMP, DISP12):
+ case C (UNCD_JUMP, DISP12):
{
/* Get the address of the end of the instruction. */
int next_inst = fragP->fr_fix + fragP->fr_address + 2;
}
break;
- case C (COND_JUMP, COND32):
+ case C (COND_JUMP, DISP32):
case C (COND_JUMP, UNDEF_WORD_DISP):
{
/* A conditional branch wont fit into 12 bits so:
}
break;
- case C (UNCD_JUMP, UNCD32):
+ case C (UNCD_JUMP, DISP32):
case C (UNCD_JUMP, UNDEF_WORD_DISP):
{
/* An unconditional branch will not fit in 12 bits, make code which
{
switch (fragP->fr_subtype)
{
+ default:
+ abort ();
+
case C (UNCD_JUMP, UNDEF_DISP):
/* Used to be a branch to somewhere which was unknown. */
if (!fragP->fr_symbol)
{
- fragP->fr_subtype = C (UNCD_JUMP, UNCD12);
- fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length;
+ fragP->fr_subtype = C (UNCD_JUMP, DISP12);
+ fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length;
}
else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
{
- fragP->fr_subtype = C (UNCD_JUMP, UNCD12);
- fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length;
+ fragP->fr_subtype = C (UNCD_JUMP, DISP12);
+ fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length;
}
else
{
fragP->fr_subtype = C (UNCD_JUMP, UNDEF_WORD_DISP);
- fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length;
- return md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length;
+ fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length;
}
break;
- default:
- abort ();
-
case C (COND_JUMP, UNDEF_DISP):
/* Used to be a branch to somewhere which was unknown. */
if (fragP->fr_symbol
{
/* Got a symbol and it's defined in this segment, become byte
sized - maybe it will fix up */
- fragP->fr_subtype = C (COND_JUMP, COND12);
- fragP->fr_var = md_relax_table[C (COND_JUMP, COND12)].rlx_length;
+ fragP->fr_subtype = C (COND_JUMP, DISP12);
+ fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length;
}
else if (fragP->fr_symbol)
{
/* Its got a segment, but its not ours, so it will always be long. */
fragP->fr_subtype = C (COND_JUMP, UNDEF_WORD_DISP);
- fragP->fr_var = md_relax_table[C (COND_JUMP, COND32)].rlx_length;
- return md_relax_table[C (COND_JUMP, COND32)].rlx_length;
+ fragP->fr_var = md_relax_table[C (COND_JUMP, DISP32)].rlx_length;
}
else
{
/* We know the abs value. */
- fragP->fr_subtype = C (COND_JUMP, COND12);
- fragP->fr_var = md_relax_table[C (COND_JUMP, COND12)].rlx_length;
+ fragP->fr_subtype = C (COND_JUMP, DISP12);
+ fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length;
}
+ break;
+ case C (UNCD_JUMP, DISP12):
+ case C (UNCD_JUMP, UNDEF_WORD_DISP):
+ case C (COND_JUMP, DISP12):
+ case C (COND_JUMP, UNDEF_WORD_DISP):
+ /* When relaxing a section for the second time, we don't need to
+ do anything. */
break;
}