projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[ARC] Add XY registers, update neg instruction.
[deliverable/binutils-gdb.git]
/
gas
/
config
/
tc-moxie.c
diff --git
a/gas/config/tc-moxie.c
b/gas/config/tc-moxie.c
index 281b69ad400f10481a649be5eae062b8c23680da..9201cb58262e97ae1969b073b315c25ffdef9ba5 100644
(file)
--- a/
gas/config/tc-moxie.c
+++ b/
gas/config/tc-moxie.c
@@
-1,6
+1,5
@@
/* tc-moxie.c -- Assemble code for moxie
/* tc-moxie.c -- Assemble code for moxie
- Copyright 2009
- Free Software Foundation, Inc.
+ Copyright (C) 2009-2016 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
This file is part of GAS, the GNU Assembler.
@@
-43,7
+42,10
@@
const pseudo_typeS md_pseudo_table[] =
const char FLT_CHARS[] = "rRsSfFdDxXpP";
const char EXP_CHARS[] = "eE";
const char FLT_CHARS[] = "rRsSfFdDxXpP";
const char EXP_CHARS[] = "eE";
-static int md_chars_to_number (char *val, int n);
+static valueT md_chars_to_number (char * buf, int n);
+
+/* Byte order. */
+extern int target_big_endian;
void
md_operand (expressionS *op __attribute__((unused)))
void
md_operand (expressionS *op __attribute__((unused)))
@@
-72,6
+74,8
@@
md_begin (void)
for (count = 0, opcode = moxie_form3_opc_info; count++ < 10; opcode++)
hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
for (count = 0, opcode = moxie_form3_opc_info; count++ < 10; opcode++)
hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
+ target_big_endian = TARGET_BYTES_BIG_ENDIAN;
+
bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
}
bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
}
@@
-97,7
+101,7
@@
parse_register_operand (char **ptr)
if (*s != '$')
{
if (*s != '$')
{
- as_bad (
"expecting register"
);
+ as_bad (
_("expecting register")
);
ignore_rest_of_line ();
return -1;
}
ignore_rest_of_line ();
return -1;
}
@@
-116,7
+120,7
@@
parse_register_operand (char **ptr)
reg = s[2] - '0';
if ((reg < 0) || (reg > 9))
{
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;
}
ignore_rest_of_line ();
return -1;
}
@@
-132,7
+136,7
@@
parse_register_operand (char **ptr)
}
else
{
}
else
{
- as_bad (
"illegal register number"
);
+ as_bad (
_("illegal register number")
);
ignore_rest_of_line ();
return -1;
}
ignore_rest_of_line ();
return -1;
}
@@
-199,11
+203,11
@@
md_assemble (char *str)
reg = parse_register_operand (&op_end);
iword += (reg << 8);
if (*op_end != ',')
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,
op_end++;
op_end = parse_exp_save_ilp (op_end, &arg);
fix_new_exp (frag_now,
- ((p
+1
) - frag_now->fr_literal),
+ ((p
+ (target_big_endian ? 1 : 0)
) - frag_now->fr_literal),
1,
&arg,
0,
1,
&arg,
0,
@@
-218,14
+222,14
@@
md_assemble (char *str)
int dest, src;
dest = parse_register_operand (&op_end);
if (*op_end != ',')
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)
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:
}
break;
case MOXIE_F1_A4:
@@
-245,7
+249,7
@@
md_assemble (char *str)
if (*op_end != ',')
{
if (*op_end != ',')
{
- as_bad (
"expecting comma delimited operands"
);
+ as_bad (
_("expecting comma delimited operands")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-285,7
+289,7
@@
md_assemble (char *str)
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
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;
break;
case MOXIE_F1_A:
iword = opcode->opcode << 8;
@@
-297,7
+301,7
@@
md_assemble (char *str)
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
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;
iword += (reg << 4);
}
break;
@@
-309,11
+313,11
@@
md_assemble (char *str)
int a, b;
a = parse_register_operand (&op_end);
if (*op_end != ',')
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 != '(')
{
op_end++;
if (*op_end != '(')
{
- as_bad (
"expecting indirect register `($rA)'"
);
+ as_bad (
_("expecting indirect register `($rA)'")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-321,7
+325,7
@@
md_assemble (char *str)
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
- as_bad (
"missing closing parenthesis"
);
+ as_bad (
_("missing closing parenthesis")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-330,7
+334,7
@@
md_assemble (char *str)
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
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:
}
break;
case MOXIE_F1_AiB:
@@
-341,7
+345,7
@@
md_assemble (char *str)
int a, b;
if (*op_end != '(')
{
int a, b;
if (*op_end != '(')
{
- as_bad (
"expecting indirect register `($rA)'"
);
+ as_bad (
_("expecting indirect register `($rA)'")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-349,20
+353,20
@@
md_assemble (char *str)
a = parse_register_operand (&op_end);
if (*op_end != ')')
{
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 != ',')
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)
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:
}
break;
case MOXIE_F1_4A:
@@
-385,7
+389,7
@@
md_assemble (char *str)
if (*op_end != ',')
{
if (*op_end != ',')
{
- as_bad (
"expecting comma delimited operands"
);
+ as_bad (
_("expecting comma delimited operands")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-395,12
+399,12
@@
md_assemble (char *str)
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
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);
}
break;
iword += (a << 4);
}
break;
- case MOXIE_F1_ABi
4
:
+ case MOXIE_F1_ABi
2
:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
@@
-415,24
+419,24
@@
md_assemble (char *str)
if (*op_end != ',')
{
if (*op_end != ',')
{
- as_bad (
"expecting comma delimited operands"
);
+ as_bad (
_("expecting comma delimited operands")
);
ignore_rest_of_line ();
return;
}
op_end++;
op_end = parse_exp_save_ilp (op_end, &arg);
ignore_rest_of_line ();
return;
}
op_end++;
op_end = parse_exp_save_ilp (op_end, &arg);
- offset = frag_more (
4
);
+ offset = frag_more (
2
);
fix_new_exp (frag_now,
(offset - frag_now->fr_literal),
fix_new_exp (frag_now,
(offset - frag_now->fr_literal),
-
4
,
+
2
,
&arg,
0,
&arg,
0,
- BFD_RELOC_
32
);
+ BFD_RELOC_
16
);
if (*op_end != '(')
{
if (*op_end != '(')
{
- as_bad (
"expecting indirect register `($rX)'"
);
+ as_bad (
_("expecting indirect register `($rX)'")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-440,7
+444,7
@@
md_assemble (char *str)
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
- as_bad (
"missing closing parenthesis"
);
+ as_bad (
_("missing closing parenthesis")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-449,12
+453,12
@@
md_assemble (char *str)
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
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;
}
break;
iword += (a << 4) + b;
}
break;
- case MOXIE_F1_AiB
4
:
+ case MOXIE_F1_AiB
2
:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
@@
-464,17
+468,17
@@
md_assemble (char *str)
int a, b;
op_end = parse_exp_save_ilp (op_end, &arg);
int a, b;
op_end = parse_exp_save_ilp (op_end, &arg);
- offset = frag_more (
4
);
+ offset = frag_more (
2
);
fix_new_exp (frag_now,
(offset - frag_now->fr_literal),
fix_new_exp (frag_now,
(offset - frag_now->fr_literal),
-
4
,
+
2
,
&arg,
0,
&arg,
0,
- BFD_RELOC_
32
);
+ BFD_RELOC_
16
);
if (*op_end != '(')
{
if (*op_end != '(')
{
- as_bad (
"expecting indirect register `($rX)'"
);
+ as_bad (
_("expecting indirect register `($rX)'")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-482,7
+486,7
@@
md_assemble (char *str)
a = parse_register_operand (&op_end);
if (*op_end != ')')
{
a = parse_register_operand (&op_end);
if (*op_end != ')')
{
- as_bad (
"missing closing parenthesis"
);
+ as_bad (
_("missing closing parenthesis")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-490,7
+494,7
@@
md_assemble (char *str)
if (*op_end != ',')
{
if (*op_end != ',')
{
- as_bad (
"expecting comma delimited operands"
);
+ as_bad (
_("expecting comma delimited operands")
);
ignore_rest_of_line ();
return;
}
ignore_rest_of_line ();
return;
}
@@
-503,7
+507,7
@@
md_assemble (char *str)
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
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;
}
iword += (a << 4) + b;
}
@@
-513,7
+517,7
@@
md_assemble (char *str)
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
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);
break;
case MOXIE_F3_PCREL:
iword = (3<<14) | (opcode->opcode << 10);
@@
-532,7
+536,7
@@
md_assemble (char *str)
}
break;
default:
}
break;
default:
- abort();
+ abort
();
}
md_number_to_chars (p, iword, 2);
}
md_number_to_chars (p, iword, 2);
@@
-541,10
+545,10
@@
md_assemble (char *str)
op_end++;
if (*op_end != 0)
op_end++;
if (*op_end != 0)
- as_warn (
"extra stuff on line ignored"
);
+ as_warn (
_("extra stuff on line ignored")
);
if (pending_reloc)
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
}
/* Turn a string in input_line_pointer into a floating point constant
@@
-552,7
+556,7
@@
md_assemble (char *str)
of LITTLENUMS emitted is stored in *SIZEP . An error message is
returned, or NULL on OK. */
of LITTLENUMS emitted is stored in *SIZEP . An error message is
returned, or NULL on OK. */
-char *
+c
onst c
har *
md_atof (int type, char *litP, int *sizeP)
{
int prec;
md_atof (int type, char *litP, int *sizeP)
{
int prec;
@@
-589,54
+593,94
@@
md_atof (int type, char *litP, int *sizeP)
return NULL;
}
return NULL;
}
-
\f
-const char *md_shortopts = "";
+
+enum options
+{
+ OPTION_EB = OPTION_MD_BASE,
+ OPTION_EL,
+};
struct option md_longopts[] =
{
struct option md_longopts[] =
{
- {NULL, no_argument, NULL, 0}
+ { "EB", no_argument, NULL, OPTION_EB},
+ { "EL", no_argument, NULL, OPTION_EL},
+ { NULL, no_argument, NULL, 0}
};
};
+
size_t md_longopts_size = sizeof (md_longopts);
size_t md_longopts_size = sizeof (md_longopts);
+
\f
+const char *md_shortopts = "";
-/* We have no target specific options yet, so these next
- two functions are empty. */
int
int
-md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
+md_parse_option (int c ATTRIBUTE_UNUSED, c
onst c
har *arg ATTRIBUTE_UNUSED)
{
{
- return 0;
+ switch (c)
+ {
+ case OPTION_EB:
+ target_big_endian = 1;
+ break;
+ case OPTION_EL:
+ target_big_endian = 0;
+ break;
+ default:
+ return 0;
+ }
+
+ return 1;
}
void
md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
{
}
void
md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
{
+ fprintf (stream, _("\
+ -EB assemble for a big endian system (default)\n\
+ -EL assemble for a little endian system\n"));
}
/* Apply a fixup to the object file. */
void
}
/* Apply a fixup to the object file. */
void
-md_apply_fix (fixS *fixP 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;
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;
max = min = 0;
- shift = 0;
switch (fixP->fx_r_type)
{
case BFD_RELOC_32:
switch (fixP->fx_r_type)
{
case BFD_RELOC_32:
- *buf++ = val >> 24;
- *buf++ = val >> 16;
- *buf++ = val >> 8;
- *buf++ = val >> 0;
+ if (target_big_endian)
+ {
+ buf[0] = val >> 24;
+ buf[1] = val >> 16;
+ buf[2] = val >> 8;
+ buf[3] = val >> 0;
+ }
+ else
+ {
+ buf[3] = val >> 24;
+ buf[2] = val >> 16;
+ buf[1] = val >> 8;
+ buf[0] = val >> 0;
+ }
+ buf += 4;
break;
case BFD_RELOC_16:
break;
case BFD_RELOC_16:
- *buf++ = val >> 8;
- *buf++ = val >> 0;
+ if (target_big_endian)
+ {
+ buf[0] = val >> 8;
+ buf[1] = val >> 0;
+ }
+ else
+ {
+ buf[1] = val >> 8;
+ buf[0] = val >> 0;
+ }
+ buf += 2;
break;
case BFD_RELOC_8:
break;
case BFD_RELOC_8:
@@
-667,28
+711,43
@@
md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED,
fixP->fx_done = 1;
}
fixP->fx_done = 1;
}
-/* Put number into target byte order
(big endian)
. */
+/* Put number into target byte order. */
void
void
-md_number_to_chars (char *ptr, valueT use, int nbytes)
+md_number_to_chars (char *
ptr, valueT use, int nbytes)
{
{
- number_to_chars_bigendian (ptr, use, nbytes);
+ if (target_big_endian)
+ number_to_chars_bigendian (ptr, use, nbytes);
+ else
+ number_to_chars_littleendian (ptr, use, nbytes);
}
/* Convert from target byte order to host byte order. */
}
/* Convert from target byte order to host byte order. */
-static
int
-md_chars_to_number (char *
val
, int n)
+static
valueT
+md_chars_to_number (char *
buf
, int n)
{
{
- int retval = 0;
+ valueT result = 0;
+ unsigned char * where = (unsigned char *) buf;
- while (n--)
+ if (target_big_endian)
+ {
+ while (n--)
+ {
+ result <<= 8;
+ result |= (*where++ & 255);
+ }
+ }
+ else
{
{
- retval <<= 8;
- retval |= (*val++ & 255);
+ while (n--)
+ {
+ result <<= 8;
+ result |= (where[n] & 255);
+ }
}
}
- return re
tval
;
+ return re
sult
;
}
/* Generate a machine-dependent relocation. */
}
/* Generate a machine-dependent relocation. */
@@
-712,9
+771,8
@@
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
return 0;
}
return 0;
}
- relP = xmalloc (sizeof (arelent));
- assert (relP != 0);
- relP->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
+ relP = XNEW (arelent);
+ relP->sym_ptr_ptr = XNEW (asymbol *);
*relP->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
relP->address = fixP->fx_frag->fr_address + fixP->fx_where;
*relP->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
relP->address = fixP->fx_frag->fr_address + fixP->fx_where;
@@
-776,7
+834,8
@@
md_pcrel_from (fixS *fixP)
case BFD_RELOC_32:
return addr + 4;
case BFD_RELOC_MOXIE_10_PCREL:
case BFD_RELOC_32:
return addr + 4;
case BFD_RELOC_MOXIE_10_PCREL:
- return addr;
+ /* Offset is from the end of the instruction. */
+ return addr + 2;
default:
abort ();
return addr;
default:
abort ();
return addr;
This page took
0.060082 seconds
and
4
git commands to generate.