const char FLT_CHARS[] = "rRsSfFdDxXpP";
const char EXP_CHARS[] = "eE";
+static int md_chars_to_number (char *val, int n);
+
void
md_operand (expressionS *op __attribute__((unused)))
{
for (count = 0, opcode = moxie_form2_opc_info; count++ < 4; opcode++)
hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
- for (count = 0, opcode = moxie_form3_opc_info; count++ < 4; opcode++)
+ for (count = 0, opcode = moxie_form3_opc_info; count++ < 10; opcode++)
hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
if (*s != '$')
{
- as_bad ("expecting register");
+ as_bad (_("expecting register"));
ignore_rest_of_line ();
return -1;
}
reg = s[2] - '0';
if ((reg < 0) || (reg > 9))
{
- as_bad ("illegal register number");
+ as_bad (_("illegal register number"));
ignore_rest_of_line ();
return -1;
}
}
else
{
- as_bad ("illegal register number");
+ as_bad (_("illegal register number"));
ignore_rest_of_line ();
return -1;
}
reg = parse_register_operand (&op_end);
iword += (reg << 8);
if (*op_end != ',')
- as_warn ("expecting comma delimeted register operands");
+ as_warn (_("expecting comma delimited register operands"));
op_end++;
op_end = parse_exp_save_ilp (op_end, &arg);
fix_new_exp (frag_now,
int dest, src;
dest = parse_register_operand (&op_end);
if (*op_end != ',')
- as_warn ("expecting comma delimeted register operands");
+ as_warn (_("expecting comma delimited register operands"));
op_end++;
src = parse_register_operand (&op_end);
iword += (dest << 4) + src;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
}
break;
case MOXIE_F1_A4:
if (*op_end != ',')
{
- as_bad ("expecting comma delimited operands");
+ as_bad (_("expecting comma delimited operands"));
ignore_rest_of_line ();
return;
}
BFD_RELOC_32);
}
break;
+ case MOXIE_F1_M:
case MOXIE_F1_4:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
break;
case MOXIE_F1_A:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
iword += (reg << 4);
}
break;
int a, b;
a = parse_register_operand (&op_end);
if (*op_end != ',')
- as_warn ("expecting comma delimeted register operands");
+ as_warn (_("expecting comma delimited register operands"));
op_end++;
if (*op_end != '(')
{
- as_bad ("expecting indirect register `($rA)'");
+ as_bad (_("expecting indirect register `($rA)'"));
ignore_rest_of_line ();
return;
}
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
- as_bad ("missing closing parenthesis");
+ as_bad (_("missing closing parenthesis"));
ignore_rest_of_line ();
return;
}
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
}
break;
case MOXIE_F1_AiB:
int a, b;
if (*op_end != '(')
{
- as_bad ("expecting indirect register `($rA)'");
+ as_bad (_("expecting indirect register `($rA)'"));
ignore_rest_of_line ();
return;
}
a = parse_register_operand (&op_end);
if (*op_end != ')')
{
- as_bad ("missing closing parenthesis");
+ as_bad (_("missing closing parenthesis"));
ignore_rest_of_line ();
return;
}
op_end++;
if (*op_end != ',')
- as_warn ("expecting comma delimeted register operands");
+ as_warn (_("expecting comma delimited register operands"));
op_end++;
b = parse_register_operand (&op_end);
iword += (a << 4) + b;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
}
break;
case MOXIE_F1_4A:
if (*op_end != ',')
{
- as_bad ("expecting comma delimited operands");
+ as_bad (_("expecting comma delimited operands"));
ignore_rest_of_line ();
return;
}
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
iword += (a << 4);
}
if (*op_end != ',')
{
- as_bad ("expecting comma delimited operands");
+ as_bad (_("expecting comma delimited operands"));
ignore_rest_of_line ();
return;
}
if (*op_end != '(')
{
- as_bad ("expecting indirect register `($rX)'");
+ as_bad (_("expecting indirect register `($rX)'"));
ignore_rest_of_line ();
return;
}
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
- as_bad ("missing closing parenthesis");
+ as_bad (_("missing closing parenthesis"));
ignore_rest_of_line ();
return;
}
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
iword += (a << 4) + b;
}
if (*op_end != '(')
{
- as_bad ("expecting indirect register `($rX)'");
+ as_bad (_("expecting indirect register `($rX)'"));
ignore_rest_of_line ();
return;
}
a = parse_register_operand (&op_end);
if (*op_end != ')')
{
- as_bad ("missing closing parenthesis");
+ as_bad (_("missing closing parenthesis"));
ignore_rest_of_line ();
return;
}
if (*op_end != ',')
{
- as_bad ("expecting comma delimited operands");
+ as_bad (_("expecting comma delimited operands"));
ignore_rest_of_line ();
return;
}
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
iword += (a << 4) + b;
}
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
+ break;
+ case MOXIE_F3_PCREL:
+ iword = (3<<14) | (opcode->opcode << 10);
+ while (ISSPACE (*op_end))
+ op_end++;
+ {
+ expressionS arg;
+
+ op_end = parse_exp_save_ilp (op_end, &arg);
+ fix_new_exp (frag_now,
+ (p - frag_now->fr_literal),
+ 2,
+ &arg,
+ TRUE,
+ BFD_RELOC_MOXIE_10_PCREL);
+ }
break;
default:
- abort();
+ abort ();
}
md_number_to_chars (p, iword, 2);
op_end++;
if (*op_end != 0)
- as_warn ("extra stuff on line ignored");
+ as_warn (_("extra stuff on line ignored"));
if (pending_reloc)
- as_bad ("Something forgot to clean up\n");
+ as_bad (_("Something forgot to clean up\n"));
}
/* Turn a string in input_line_pointer into a floating point constant
/* Apply a fixup to the object file. */
void
-md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED, valueT * valP ATTRIBUTE_UNUSED, segT seg ATTRIBUTE_UNUSED)
+md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED,
+ valueT * valP ATTRIBUTE_UNUSED, segT seg ATTRIBUTE_UNUSED)
{
char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
long val = *valP;
+ long newval;
long max, min;
- int shift;
max = min = 0;
- shift = 0;
switch (fixP->fx_r_type)
{
case BFD_RELOC_32:
*buf++ = val;
break;
+ case BFD_RELOC_MOXIE_10_PCREL:
+ if (!val)
+ break;
+ if (val < -1024 || val > 1022)
+ as_bad_where (fixP->fx_file, fixP->fx_line,
+ _("pcrel too far BFD_RELOC_MOXIE_10"));
+ /* 11 bit offset even numbered, so we remove right bit. */
+ val >>= 1;
+ newval = md_chars_to_number (buf, 2);
+ newval |= val & 0x03ff;
+ md_number_to_chars (buf, newval, 2);
+ break;
+
default:
abort ();
}
number_to_chars_bigendian (ptr, use, nbytes);
}
+/* Convert from target byte order to host byte order. */
+
+static int
+md_chars_to_number (char *val, int n)
+{
+ int retval = 0;
+
+ while (n--)
+ {
+ retval <<= 8;
+ retval |= (*val++ & 255);
+ }
+
+ return retval;
+}
+
/* Generate a machine-dependent relocation. */
arelent *
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
case BFD_RELOC_32:
code = fixP->fx_r_type;
break;
+ case BFD_RELOC_MOXIE_10_PCREL:
+ code = fixP->fx_r_type;
+ break;
default:
as_bad_where (fixP->fx_file, fixP->fx_line,
_("Semantics error. This type of operand can not be relocated, it must be an assembly-time constant"));
}
relP = xmalloc (sizeof (arelent));
- assert (relP != 0);
+ gas_assert (relP != 0);
relP->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
*relP->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
relP->address = fixP->fx_frag->fr_address + fixP->fx_where;
{
valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
- fprintf (stderr, "md_pcrel_from 0x%d\n", fixP->fx_r_type);
-
switch (fixP->fx_r_type)
{
case BFD_RELOC_32:
return addr + 4;
+ case BFD_RELOC_MOXIE_10_PCREL:
+ return addr;
default:
abort ();
return addr;