tc-arc.c revision 130562
1/* tc-arc.c -- Assembler for the ARC
2   Copyright 1994, 1995, 1997, 1999, 2000, 2001, 2002
3   Free Software Foundation, Inc.
4   Contributed by Doug Evans (dje@cygnus.com).
5
6   This file is part of GAS, the GNU Assembler.
7
8   GAS is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2, or (at your option)
11   any later version.
12
13   GAS is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with GAS; see the file COPYING.  If not, write to the Free
20   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21   02111-1307, USA.  */
22
23#include <stdio.h>
24#include "libiberty.h"
25#include "as.h"
26#include "struc-symbol.h"
27#include "safe-ctype.h"
28#include "subsegs.h"
29#include "opcode/arc.h"
30#include "../opcodes/arc-ext.h"
31#include "elf/arc.h"
32#include "dwarf2dbg.h"
33
34extern int arc_get_mach PARAMS ((char *));
35extern int arc_operand_type PARAMS ((int));
36extern int arc_insn_not_jl PARAMS ((arc_insn));
37extern int arc_limm_fixup_adjust PARAMS ((arc_insn));
38extern int arc_get_noshortcut_flag PARAMS ((void));
39extern int arc_set_ext_seg PARAMS ((void));
40extern void arc_code_symbol PARAMS ((expressionS *));
41
42static arc_insn arc_insert_operand PARAMS ((arc_insn,
43					    const struct arc_operand *, int,
44					    const struct arc_operand_value *,
45					    offsetT, char *, unsigned int));
46static void arc_common PARAMS ((int));
47static void arc_extinst PARAMS ((int));
48static void arc_extoper PARAMS ((int));
49static void arc_option PARAMS ((int));
50static int  get_arc_exp_reloc_type PARAMS ((int, int, expressionS *,
51					   expressionS *));
52
53static void init_opcode_tables PARAMS ((int));
54
55const struct suffix_classes {
56  char *name;
57  int  len;
58} suffixclass[] = {
59  { "SUFFIX_COND|SUFFIX_FLAG",23 },
60  { "SUFFIX_FLAG", 11 },
61  { "SUFFIX_COND", 11 },
62  { "SUFFIX_NONE", 11 }
63};
64
65#define MAXSUFFIXCLASS (sizeof (suffixclass) / sizeof (struct suffix_classes))
66
67const struct syntax_classes {
68  char *name;
69  int  len;
70  int  class;
71} syntaxclass[] = {
72  { "SYNTAX_3OP|OP1_MUST_BE_IMM", 26, SYNTAX_3OP|OP1_MUST_BE_IMM|SYNTAX_VALID },
73  { "OP1_MUST_BE_IMM|SYNTAX_3OP", 26, OP1_MUST_BE_IMM|SYNTAX_3OP|SYNTAX_VALID },
74  { "SYNTAX_2OP|OP1_IMM_IMPLIED", 26, SYNTAX_2OP|OP1_IMM_IMPLIED|SYNTAX_VALID },
75  { "OP1_IMM_IMPLIED|SYNTAX_2OP", 26, OP1_IMM_IMPLIED|SYNTAX_2OP|SYNTAX_VALID },
76  { "SYNTAX_3OP",                 10, SYNTAX_3OP|SYNTAX_VALID },
77  { "SYNTAX_2OP",                 10, SYNTAX_2OP|SYNTAX_VALID }
78};
79
80#define MAXSYNTAXCLASS (sizeof (syntaxclass) / sizeof (struct syntax_classes))
81
82const pseudo_typeS md_pseudo_table[] = {
83  { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
84  { "comm", arc_common, 0 },
85  { "common", arc_common, 0 },
86  { "lcomm", arc_common, 1 },
87  { "lcommon", arc_common, 1 },
88  { "2byte", cons, 2 },
89  { "half", cons, 2 },
90  { "short", cons, 2 },
91  { "3byte", cons, 3 },
92  { "4byte", cons, 4 },
93  { "word", cons, 4 },
94  { "option", arc_option, 0 },
95  { "cpu", arc_option, 0 },
96  { "block", s_space, 0 },
97  { "extcondcode", arc_extoper, 0 },
98  { "extcoreregister", arc_extoper, 1 },
99  { "extauxregister", arc_extoper, 2 },
100  { "extinstruction", arc_extinst, 0 },
101  { NULL, 0, 0 },
102};
103
104/* This array holds the chars that always start a comment.  If the
105   pre-processor is disabled, these aren't very useful.  */
106const char comment_chars[] = "#;";
107
108/* This array holds the chars that only start a comment at the beginning of
109   a line.  If the line seems to have the form '# 123 filename'
110   .line and .file directives will appear in the pre-processed output */
111/* Note that input_file.c hand checks for '#' at the beginning of the
112   first line of the input file.  This is because the compiler outputs
113   #NO_APP at the beginning of its output.  */
114/* Also note that comments started like this one will always
115   work if '/' isn't otherwise defined.  */
116const char line_comment_chars[] = "#";
117
118const char line_separator_chars[] = "";
119
120/* Chars that can be used to separate mant from exp in floating point nums.  */
121const char EXP_CHARS[] = "eE";
122
123/* Chars that mean this number is a floating point constant
124   As in 0f12.456 or 0d1.2345e12.  */
125const char FLT_CHARS[] = "rRsSfFdD";
126
127/* Byte order.  */
128extern int target_big_endian;
129const char *arc_target_format = DEFAULT_TARGET_FORMAT;
130static int byte_order = DEFAULT_BYTE_ORDER;
131
132static segT arcext_section;
133
134/* One of bfd_mach_arc_n.  */
135static int arc_mach_type = bfd_mach_arc_6;
136
137/* Non-zero if the cpu type has been explicitly specified.  */
138static int mach_type_specified_p = 0;
139
140/* Non-zero if opcode tables have been initialized.
141   A .option command must appear before any instructions.  */
142static int cpu_tables_init_p = 0;
143
144static struct hash_control *arc_suffix_hash = NULL;
145
146const char *md_shortopts = "";
147struct option md_longopts[] = {
148#define OPTION_EB (OPTION_MD_BASE + 0)
149  { "EB", no_argument, NULL, OPTION_EB },
150#define OPTION_EL (OPTION_MD_BASE + 1)
151  { "EL", no_argument, NULL, OPTION_EL },
152#define OPTION_ARC5 (OPTION_MD_BASE + 2)
153  { "marc5", no_argument, NULL, OPTION_ARC5 },
154  { "pre-v6", no_argument, NULL, OPTION_ARC5 },
155#define OPTION_ARC6 (OPTION_MD_BASE + 3)
156  { "marc6", no_argument, NULL, OPTION_ARC6 },
157#define OPTION_ARC7 (OPTION_MD_BASE + 4)
158  { "marc7", no_argument, NULL, OPTION_ARC7 },
159#define OPTION_ARC8 (OPTION_MD_BASE + 5)
160  { "marc8", no_argument, NULL, OPTION_ARC8 },
161#define OPTION_ARC (OPTION_MD_BASE + 6)
162  { "marc", no_argument, NULL, OPTION_ARC },
163  { NULL, no_argument, NULL, 0 }
164};
165size_t md_longopts_size = sizeof (md_longopts);
166
167#define IS_SYMBOL_OPERAND(o) \
168 ((o) == 'b' || (o) == 'c' || (o) == 's' || (o) == 'o' || (o) == 'O')
169
170struct arc_operand_value *get_ext_suffix (char *s);
171
172/* Invocation line includes a switch not recognized by the base assembler.
173   See if it's a processor-specific option.  */
174
175int
176md_parse_option (c, arg)
177     int c;
178     char *arg ATTRIBUTE_UNUSED;
179{
180  switch (c)
181    {
182    case OPTION_ARC5:
183      arc_mach_type = bfd_mach_arc_5;
184      break;
185    case OPTION_ARC:
186    case OPTION_ARC6:
187      arc_mach_type = bfd_mach_arc_6;
188      break;
189    case OPTION_ARC7:
190      arc_mach_type = bfd_mach_arc_7;
191      break;
192    case OPTION_ARC8:
193      arc_mach_type = bfd_mach_arc_8;
194      break;
195    case OPTION_EB:
196      byte_order = BIG_ENDIAN;
197      arc_target_format = "elf32-bigarc";
198      break;
199    case OPTION_EL:
200      byte_order = LITTLE_ENDIAN;
201      arc_target_format = "elf32-littlearc";
202      break;
203    default:
204      return 0;
205    }
206  return 1;
207}
208
209void
210md_show_usage (stream)
211     FILE *stream;
212{
213  fprintf (stream, "\
214ARC Options:\n\
215  -marc[5|6|7|8]          select processor variant (default arc%d)\n\
216  -EB                     assemble code for a big endian cpu\n\
217  -EL                     assemble code for a little endian cpu\n", arc_mach_type + 5);
218}
219
220/* This function is called once, at assembler startup time.  It should
221   set up all the tables, etc. that the MD part of the assembler will need.
222   Opcode selection is deferred until later because we might see a .option
223   command.  */
224
225void
226md_begin ()
227{
228  /* The endianness can be chosen "at the factory".  */
229  target_big_endian = byte_order == BIG_ENDIAN;
230
231  if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, arc_mach_type))
232    as_warn ("could not set architecture and machine");
233
234  /* This call is necessary because we need to initialize `arc_operand_map'
235     which may be needed before we see the first insn.  */
236  arc_opcode_init_tables (arc_get_opcode_mach (arc_mach_type,
237					       target_big_endian));
238}
239
240/* Initialize the various opcode and operand tables.
241   MACH is one of bfd_mach_arc_xxx.  */
242static void
243init_opcode_tables (mach)
244     int mach;
245{
246  int i;
247  char *last;
248
249  if ((arc_suffix_hash = hash_new ()) == NULL)
250    as_fatal ("virtual memory exhausted");
251
252  if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
253    as_warn ("could not set architecture and machine");
254
255  /* This initializes a few things in arc-opc.c that we need.
256     This must be called before the various arc_xxx_supported fns.  */
257  arc_opcode_init_tables (arc_get_opcode_mach (mach, target_big_endian));
258
259  /* Only put the first entry of each equivalently named suffix in the
260     table.  */
261  last = "";
262  for (i = 0; i < arc_suffixes_count; i++)
263    {
264      if (strcmp (arc_suffixes[i].name, last) != 0)
265	hash_insert (arc_suffix_hash, arc_suffixes[i].name, (PTR) (arc_suffixes + i));
266      last = arc_suffixes[i].name;
267    }
268
269  /* Since registers don't have a prefix, we put them in the symbol table so
270     they can't be used as symbols.  This also simplifies argument parsing as
271     we can let gas parse registers for us.  The recorded register number is
272     the address of the register's entry in arc_reg_names.
273
274     If the register name is already in the table, then the existing
275     definition is assumed to be from an .ExtCoreRegister pseudo-op.  */
276
277  for (i = 0; i < arc_reg_names_count; i++)
278    {
279      if (symbol_find (arc_reg_names[i].name))
280	continue;
281      /* Use symbol_create here instead of symbol_new so we don't try to
282	 output registers into the object file's symbol table.  */
283      symbol_table_insert (symbol_create (arc_reg_names[i].name,
284					  reg_section,
285					  (int) &arc_reg_names[i],
286					  &zero_address_frag));
287    }
288
289  /* Tell `.option' it's too late.  */
290  cpu_tables_init_p = 1;
291}
292
293/* Insert an operand value into an instruction.
294   If REG is non-NULL, it is a register number and ignore VAL.  */
295
296static arc_insn
297arc_insert_operand (insn, operand, mods, reg, val, file, line)
298     arc_insn insn;
299     const struct arc_operand *operand;
300     int mods;
301     const struct arc_operand_value *reg;
302     offsetT val;
303     char *file;
304     unsigned int line;
305{
306  if (operand->bits != 32)
307    {
308      long min, max;
309      offsetT test;
310
311      if ((operand->flags & ARC_OPERAND_SIGNED) != 0)
312	{
313	  if ((operand->flags & ARC_OPERAND_SIGNOPT) != 0)
314	    max = (1 << operand->bits) - 1;
315	  else
316	    max = (1 << (operand->bits - 1)) - 1;
317	  min = - (1 << (operand->bits - 1));
318	}
319      else
320	{
321	  max = (1 << operand->bits) - 1;
322	  min = 0;
323	}
324
325      if ((operand->flags & ARC_OPERAND_NEGATIVE) != 0)
326	test = - val;
327      else
328	test = val;
329
330      if (test < (offsetT) min || test > (offsetT) max)
331	{
332	  const char *err =
333	    "operand out of range (%s not between %ld and %ld)";
334	  char buf[100];
335
336	  sprint_value (buf, test);
337	  if (file == (char *) NULL)
338	    as_warn (err, buf, min, max);
339	  else
340	    as_warn_where (file, line, err, buf, min, max);
341	}
342    }
343
344  if (operand->insert)
345    {
346      const char *errmsg;
347
348      errmsg = NULL;
349      insn = (*operand->insert) (insn, operand, mods, reg, (long) val, &errmsg);
350      if (errmsg != (const char *) NULL)
351	as_warn (errmsg);
352    }
353  else
354    insn |= (((long) val & ((1 << operand->bits) - 1))
355	     << operand->shift);
356
357  return insn;
358}
359
360/* We need to keep a list of fixups.  We can't simply generate them as
361   we go, because that would require us to first create the frag, and
362   that would screw up references to ``.''.  */
363
364struct arc_fixup {
365  /* index into `arc_operands'  */
366  int opindex;
367  expressionS exp;
368};
369
370#define MAX_FIXUPS 5
371
372#define MAX_SUFFIXES 5
373
374/* This routine is called for each instruction to be assembled.  */
375
376void
377md_assemble (str)
378     char *str;
379{
380  const struct arc_opcode *opcode;
381  const struct arc_opcode *std_opcode;
382  struct arc_opcode *ext_opcode;
383  char *start;
384  const char *last_errmsg = 0;
385  arc_insn insn;
386  static int init_tables_p = 0;
387
388  /* Opcode table initialization is deferred until here because we have to
389     wait for a possible .option command.  */
390  if (!init_tables_p)
391    {
392      init_opcode_tables (arc_mach_type);
393      init_tables_p = 1;
394    }
395
396  /* Skip leading white space.  */
397  while (ISSPACE (*str))
398    str++;
399
400  /* The instructions are stored in lists hashed by the first letter (though
401     we needn't care how they're hashed).  Get the first in the list.  */
402
403  ext_opcode = arc_ext_opcodes;
404  std_opcode = arc_opcode_lookup_asm (str);
405
406  /* Keep looking until we find a match.  */
407
408  start = str;
409  for (opcode = (ext_opcode ? ext_opcode : std_opcode);
410       opcode != NULL;
411       opcode = (ARC_OPCODE_NEXT_ASM (opcode)
412		 ? ARC_OPCODE_NEXT_ASM (opcode)
413		 : (ext_opcode ? ext_opcode = NULL, std_opcode : NULL)))
414    {
415      int past_opcode_p, fc, num_suffixes;
416      int fix_up_at = 0;
417      char *syn;
418      struct arc_fixup fixups[MAX_FIXUPS];
419      /* Used as a sanity check.  If we need a limm reloc, make sure we ask
420	 for an extra 4 bytes from frag_more.  */
421      int limm_reloc_p;
422      int ext_suffix_p;
423      const struct arc_operand_value *insn_suffixes[MAX_SUFFIXES];
424
425      /* Is this opcode supported by the selected cpu?  */
426      if (! arc_opcode_supported (opcode))
427	continue;
428
429      /* Scan the syntax string.  If it doesn't match, try the next one.  */
430
431      arc_opcode_init_insert ();
432      insn = opcode->value;
433      fc = 0;
434      past_opcode_p = 0;
435      num_suffixes = 0;
436      limm_reloc_p = 0;
437      ext_suffix_p = 0;
438
439      /* We don't check for (*str != '\0') here because we want to parse
440	 any trailing fake arguments in the syntax string.  */
441      for (str = start, syn = opcode->syntax; *syn != '\0';)
442	{
443	  int mods;
444	  const struct arc_operand *operand;
445
446	  /* Non operand chars must match exactly.  */
447	  if (*syn != '%' || *++syn == '%')
448	    {
449	      /* Handle '+' specially as we want to allow "ld r0,[sp-4]".  */
450	      /* ??? The syntax has changed to [sp,-4].  */
451	      if (0 && *syn == '+' && *str == '-')
452		{
453		  /* Skip over syn's +, but leave str's - alone.
454		     That makes the case identical to "ld r0,[sp+-4]".  */
455		  ++syn;
456		}
457	      else if (*str == *syn)
458		{
459		  if (*syn == ' ')
460		    past_opcode_p = 1;
461		  ++syn;
462		  ++str;
463		}
464	      else
465		break;
466	      continue;
467	    }
468
469	  /* We have an operand.  Pick out any modifiers.  */
470	  mods = 0;
471	  while (ARC_MOD_P (arc_operands[arc_operand_map[(int) *syn]].flags))
472	    {
473	      mods |= arc_operands[arc_operand_map[(int) *syn]].flags & ARC_MOD_BITS;
474	      ++syn;
475	    }
476	  operand = arc_operands + arc_operand_map[(int) *syn];
477	  if (operand->fmt == 0)
478	    as_fatal ("unknown syntax format character `%c'", *syn);
479
480	  if (operand->flags & ARC_OPERAND_FAKE)
481	    {
482	      const char *errmsg = NULL;
483	      if (operand->insert)
484		{
485		  insn = (*operand->insert) (insn, operand, mods, NULL, 0, &errmsg);
486		  if (errmsg != (const char *) NULL)
487		    {
488		      last_errmsg = errmsg;
489		      if (operand->flags & ARC_OPERAND_ERROR)
490			{
491			  as_bad (errmsg);
492			  return;
493			}
494		      else if (operand->flags & ARC_OPERAND_WARN)
495			as_warn (errmsg);
496		      break;
497		    }
498		  if (limm_reloc_p
499		      && (operand->flags && operand->flags & ARC_OPERAND_LIMM)
500		      && (operand->flags &
501			  (ARC_OPERAND_ABSOLUTE_BRANCH | ARC_OPERAND_ADDRESS)))
502		    {
503		      fixups[fix_up_at].opindex = arc_operand_map[operand->fmt];
504		    }
505		}
506	      ++syn;
507	    }
508	  /* Are we finished with suffixes?  */
509	  else if (!past_opcode_p)
510	    {
511	      int found;
512	      char c;
513	      char *s, *t;
514	      const struct arc_operand_value *suf, *suffix_end;
515	      const struct arc_operand_value *suffix = NULL;
516
517	      if (!(operand->flags & ARC_OPERAND_SUFFIX))
518		abort ();
519
520	      /* If we're at a space in the input string, we want to skip the
521		 remaining suffixes.  There may be some fake ones though, so
522		 just go on to try the next one.  */
523	      if (*str == ' ')
524		{
525		  ++syn;
526		  continue;
527		}
528
529	      s = str;
530	      if (mods & ARC_MOD_DOT)
531		{
532		  if (*s != '.')
533		    break;
534		  ++s;
535		}
536	      else
537		{
538		  /* This can happen in "b.nd foo" and we're currently looking
539		     for "%q" (ie: a condition code suffix).  */
540		  if (*s == '.')
541		    {
542		      ++syn;
543		      continue;
544		    }
545		}
546
547	      /* Pick the suffix out and look it up via the hash table.  */
548	      for (t = s; *t && ISALNUM (*t); ++t)
549		continue;
550	      c = *t;
551	      *t = '\0';
552	      if ((suf = get_ext_suffix (s)))
553		ext_suffix_p = 1;
554	      else
555		suf = hash_find (arc_suffix_hash, s);
556	      if (!suf)
557		{
558		  /* This can happen in "blle foo" and we're currently using
559		     the template "b%q%.n %j".  The "bl" insn occurs later in
560		     the table so "lle" isn't an illegal suffix.  */
561		  *t = c;
562		  break;
563		}
564
565	      /* Is it the right type?  Note that the same character is used
566		 several times, so we have to examine all of them.  This is
567		 relatively efficient as equivalent entries are kept
568		 together.  If it's not the right type, don't increment `str'
569		 so we try the next one in the series.  */
570	      found = 0;
571	      if (ext_suffix_p && arc_operands[suf->type].fmt == *syn)
572		{
573		  /* Insert the suffix's value into the insn.  */
574		  *t = c;
575		  if (operand->insert)
576		    insn = (*operand->insert) (insn, operand,
577					       mods, NULL, suf->value,
578					       NULL);
579		  else
580		    insn |= suf->value << operand->shift;
581
582		  str = t;
583		  found = 1;
584		}
585	      else
586		{
587		  *t = c;
588		  suffix_end = arc_suffixes + arc_suffixes_count;
589		  for (suffix = suf;
590		       suffix < suffix_end && strcmp (suffix->name, suf->name) == 0;
591		       ++suffix)
592		    {
593		      if (arc_operands[suffix->type].fmt == *syn)
594			{
595			  /* Insert the suffix's value into the insn.  */
596			  if (operand->insert)
597			    insn = (*operand->insert) (insn, operand,
598						       mods, NULL, suffix->value,
599						       NULL);
600			  else
601			    insn |= suffix->value << operand->shift;
602
603			  str = t;
604			  found = 1;
605			  break;
606			}
607		    }
608		}
609	      ++syn;
610	      if (!found)
611		/* Wrong type.  Just go on to try next insn entry.  */
612		;
613	      else
614		{
615		  if (num_suffixes == MAX_SUFFIXES)
616		    as_bad ("too many suffixes");
617		  else
618		    insn_suffixes[num_suffixes++] = suffix;
619		}
620	    }
621	  else
622	    /* This is either a register or an expression of some kind.  */
623	    {
624	      char *hold;
625	      const struct arc_operand_value *reg = NULL;
626	      long value = 0;
627	      expressionS exp;
628
629	      if (operand->flags & ARC_OPERAND_SUFFIX)
630		abort ();
631
632	      /* Is there anything left to parse?
633		 We don't check for this at the top because we want to parse
634		 any trailing fake arguments in the syntax string.  */
635	      if (is_end_of_line[(unsigned char) *str])
636		break;
637
638	      /* Parse the operand.  */
639	      hold = input_line_pointer;
640	      input_line_pointer = str;
641	      expression (&exp);
642	      str = input_line_pointer;
643	      input_line_pointer = hold;
644
645	      if (exp.X_op == O_illegal)
646		as_bad ("illegal operand");
647	      else if (exp.X_op == O_absent)
648		as_bad ("missing operand");
649	      else if (exp.X_op == O_constant)
650		{
651		  value = exp.X_add_number;
652		}
653	      else if (exp.X_op == O_register)
654		{
655		  reg = (struct arc_operand_value *) exp.X_add_number;
656		}
657#define IS_REG_DEST_OPERAND(o) ((o) == 'a')
658	      else if (IS_REG_DEST_OPERAND (*syn))
659		as_bad ("symbol as destination register");
660	      else
661		{
662		  if (!strncmp (str, "@h30", 4))
663		    {
664		      arc_code_symbol (&exp);
665		      str += 4;
666		    }
667		  /* We need to generate a fixup for this expression.  */
668		  if (fc >= MAX_FIXUPS)
669		    as_fatal ("too many fixups");
670		  fixups[fc].exp = exp;
671		  /* We don't support shimm relocs. break here to force
672		     the assembler to output a limm.  */
673#define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
674		  if (IS_REG_SHIMM_OFFSET (*syn))
675		    break;
676		  /* If this is a register constant (IE: one whose
677		     register value gets stored as 61-63) then this
678		     must be a limm.  */
679		  /* ??? This bit could use some cleaning up.
680		     Referencing the format chars like this goes
681		     against style.  */
682		  if (IS_SYMBOL_OPERAND (*syn))
683		    {
684		      const char *junk;
685		      limm_reloc_p = 1;
686		      /* Save this, we don't yet know what reloc to use.  */
687		      fix_up_at = fc;
688		      /* Tell insert_reg we need a limm.  This is
689			 needed because the value at this point is
690			 zero, a shimm.  */
691		      /* ??? We need a cleaner interface than this.  */
692		      (*arc_operands[arc_operand_map['Q']].insert)
693			(insn, operand, mods, reg, 0L, &junk);
694		    }
695		  else
696		    fixups[fc].opindex = arc_operand_map[(int) *syn];
697		  ++fc;
698		  value = 0;
699		}
700
701	      /* Insert the register or expression into the instruction.  */
702	      if (operand->insert)
703		{
704		  const char *errmsg = NULL;
705		  insn = (*operand->insert) (insn, operand, mods,
706					     reg, (long) value, &errmsg);
707		  if (errmsg != (const char *) NULL)
708		    {
709		      last_errmsg = errmsg;
710		      if (operand->flags & ARC_OPERAND_ERROR)
711			{
712			  as_bad (errmsg);
713			  return;
714			}
715		      else if (operand->flags & ARC_OPERAND_WARN)
716			as_warn (errmsg);
717		      break;
718		    }
719		}
720	      else
721		insn |= (value & ((1 << operand->bits) - 1)) << operand->shift;
722
723	      ++syn;
724	    }
725	}
726
727      /* If we're at the end of the syntax string, we're done.  */
728      /* FIXME: try to move this to a separate function.  */
729      if (*syn == '\0')
730	{
731	  int i;
732	  char *f;
733	  long limm, limm_p;
734
735	  /* For the moment we assume a valid `str' can only contain blanks
736	     now.  IE: We needn't try again with a longer version of the
737	     insn and it is assumed that longer versions of insns appear
738	     before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3).  */
739
740	  while (ISSPACE (*str))
741	    ++str;
742
743	  if (!is_end_of_line[(unsigned char) *str])
744	    as_bad ("junk at end of line: `%s'", str);
745
746	  /* Is there a limm value?  */
747	  limm_p = arc_opcode_limm_p (&limm);
748
749	  /* Perform various error and warning tests.  */
750
751	  {
752	    static int in_delay_slot_p = 0;
753	    static int prev_insn_needs_cc_nop_p = 0;
754	    /* delay slot type seen */
755	    int delay_slot_type = ARC_DELAY_NONE;
756	    /* conditional execution flag seen */
757	    int conditional = 0;
758	    /* 1 if condition codes are being set */
759	    int cc_set_p = 0;
760	    /* 1 if conditional branch, including `b' "branch always" */
761	    int cond_branch_p = opcode->flags & ARC_OPCODE_COND_BRANCH;
762
763	    for (i = 0; i < num_suffixes; ++i)
764	      {
765		switch (arc_operands[insn_suffixes[i]->type].fmt)
766		  {
767		  case 'n':
768		    delay_slot_type = insn_suffixes[i]->value;
769		    break;
770		  case 'q':
771		    conditional = insn_suffixes[i]->value;
772		    break;
773		  case 'f':
774		    cc_set_p = 1;
775		    break;
776		  }
777	      }
778
779	    /* Putting an insn with a limm value in a delay slot is supposed to
780	       be legal, but let's warn the user anyway.  Ditto for 8 byte
781	       jumps with delay slots.  */
782	    if (in_delay_slot_p && limm_p)
783	      as_warn ("8 byte instruction in delay slot");
784	    if (delay_slot_type != ARC_DELAY_NONE
785		&& limm_p && arc_insn_not_jl (insn)) /* except for jl  addr */
786	      as_warn ("8 byte jump instruction with delay slot");
787	    in_delay_slot_p = (delay_slot_type != ARC_DELAY_NONE) && !limm_p;
788
789	    /* Warn when a conditional branch immediately follows a set of
790	       the condition codes.  Note that this needn't be done if the
791	       insn that sets the condition codes uses a limm.  */
792	    if (cond_branch_p && conditional != 0 /* 0 = "always" */
793		&& prev_insn_needs_cc_nop_p && arc_mach_type == bfd_mach_arc_5)
794	      as_warn ("conditional branch follows set of flags");
795	    prev_insn_needs_cc_nop_p =
796	      /* FIXME: ??? not required:
797		 (delay_slot_type != ARC_DELAY_NONE) &&  */
798	      cc_set_p && !limm_p;
799	  }
800
801	  /* Write out the instruction.
802	     It is important to fetch enough space in one call to `frag_more'.
803	     We use (f - frag_now->fr_literal) to compute where we are and we
804	     don't want frag_now to change between calls.  */
805	  if (limm_p)
806	    {
807	      f = frag_more (8);
808	      md_number_to_chars (f, insn, 4);
809	      md_number_to_chars (f + 4, limm, 4);
810	      dwarf2_emit_insn (8);
811	    }
812	  else if (limm_reloc_p)
813	    {
814	      /* We need a limm reloc, but the tables think we don't.  */
815	      abort ();
816	    }
817	  else
818	    {
819	      f = frag_more (4);
820	      md_number_to_chars (f, insn, 4);
821	      dwarf2_emit_insn (4);
822	    }
823
824	  /* Create any fixups.  */
825	  for (i = 0; i < fc; ++i)
826	    {
827	      int op_type, reloc_type;
828	      expressionS exptmp;
829	      const struct arc_operand *operand;
830
831	      /* Create a fixup for this operand.
832		 At this point we do not use a bfd_reloc_code_real_type for
833		 operands residing in the insn, but instead just use the
834		 operand index.  This lets us easily handle fixups for any
835		 operand type, although that is admittedly not a very exciting
836		 feature.  We pick a BFD reloc type in md_apply_fix3.
837
838		 Limm values (4 byte immediate "constants") must be treated
839		 normally because they're not part of the actual insn word
840		 and thus the insertion routines don't handle them.  */
841
842	      if (arc_operands[fixups[i].opindex].flags & ARC_OPERAND_LIMM)
843		{
844		  /* Modify the fixup addend as required by the cpu.  */
845		  fixups[i].exp.X_add_number += arc_limm_fixup_adjust (insn);
846		  op_type = fixups[i].opindex;
847		  /* FIXME: can we add this data to the operand table?  */
848		  if (op_type == arc_operand_map['L']
849		      || op_type == arc_operand_map['s']
850		      || op_type == arc_operand_map['o']
851		      || op_type == arc_operand_map['O'])
852		    reloc_type = BFD_RELOC_32;
853		  else if (op_type == arc_operand_map['J'])
854		    reloc_type = BFD_RELOC_ARC_B26;
855		  else
856		    abort ();
857		  reloc_type = get_arc_exp_reloc_type (1, reloc_type,
858						       &fixups[i].exp,
859						       &exptmp);
860		}
861	      else
862		{
863		  op_type = get_arc_exp_reloc_type (0, fixups[i].opindex,
864						    &fixups[i].exp, &exptmp);
865		  reloc_type = op_type + (int) BFD_RELOC_UNUSED;
866		}
867	      operand = &arc_operands[op_type];
868	      fix_new_exp (frag_now,
869			   ((f - frag_now->fr_literal)
870			    + (operand->flags & ARC_OPERAND_LIMM ? 4 : 0)), 4,
871			   &exptmp,
872			   (operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0,
873			   (bfd_reloc_code_real_type) reloc_type);
874	    }
875
876	  /* All done.  */
877	  return;
878	}
879
880      /* Try the next entry.  */
881    }
882
883  if (NULL == last_errmsg)
884    as_bad ("bad instruction `%s'", start);
885  else
886    as_bad (last_errmsg);
887}
888
889static void
890arc_extoper (opertype)
891     int opertype;
892{
893  char *name;
894  char *mode;
895  char c;
896  char *p;
897  int imode = 0;
898  int number;
899  struct arc_ext_operand_value *ext_oper;
900  symbolS *symbolP;
901
902  segT old_sec;
903  int old_subsec;
904
905  name = input_line_pointer;
906  c = get_symbol_end ();
907  name = xstrdup (name);
908
909  p = name;
910  while (*p)
911    {
912      *p = TOLOWER (*p);
913      p++;
914    }
915
916  /* just after name is now '\0'  */
917  p = input_line_pointer;
918  *p = c;
919  SKIP_WHITESPACE ();
920
921  if (*input_line_pointer != ',')
922    {
923      as_bad ("expected comma after operand name");
924      ignore_rest_of_line ();
925      free (name);
926      return;
927    }
928
929  input_line_pointer++;		/* skip ','  */
930  number = get_absolute_expression ();
931
932  if (number < 0)
933    {
934      as_bad ("negative operand number %d", number);
935      ignore_rest_of_line ();
936      free (name);
937      return;
938    }
939
940  if (opertype)
941    {
942      SKIP_WHITESPACE ();
943
944      if (*input_line_pointer != ',')
945	{
946	  as_bad ("expected comma after register-number");
947	  ignore_rest_of_line ();
948	  free (name);
949	  return;
950	}
951
952      input_line_pointer++;		/* skip ','  */
953      mode = input_line_pointer;
954
955      if (!strncmp (mode, "r|w", 3))
956	{
957	  imode = 0;
958	  input_line_pointer += 3;
959	}
960      else
961	{
962	  if (!strncmp (mode, "r", 1))
963	    {
964	      imode = ARC_REGISTER_READONLY;
965	      input_line_pointer += 1;
966	    }
967	  else
968	    {
969	      if (strncmp (mode, "w", 1))
970		{
971		  as_bad ("invalid mode");
972		  ignore_rest_of_line ();
973		  free (name);
974		  return;
975		}
976	      else
977		{
978		  imode = ARC_REGISTER_WRITEONLY;
979		  input_line_pointer += 1;
980		}
981	    }
982	}
983      SKIP_WHITESPACE ();
984      if (1 == opertype)
985	{
986	  if (*input_line_pointer != ',')
987	    {
988	      as_bad ("expected comma after register-mode");
989	      ignore_rest_of_line ();
990	      free (name);
991	      return;
992	    }
993
994	  input_line_pointer++;		/* skip ','  */
995
996	  if (!strncmp (input_line_pointer, "cannot_shortcut", 15))
997	    {
998	      imode |= arc_get_noshortcut_flag ();
999	      input_line_pointer += 15;
1000	    }
1001	  else
1002	    {
1003	      if (strncmp (input_line_pointer, "can_shortcut", 12))
1004		{
1005		  as_bad ("shortcut designator invalid");
1006		  ignore_rest_of_line ();
1007		  free (name);
1008		  return;
1009		}
1010	      else
1011		{
1012		  input_line_pointer += 12;
1013		}
1014	    }
1015	}
1016    }
1017
1018  if ((opertype == 1) && number > 60)
1019    {
1020      as_bad ("core register value (%d) too large", number);
1021      ignore_rest_of_line ();
1022      free (name);
1023      return;
1024    }
1025
1026  if ((opertype == 0) && number > 31)
1027    {
1028      as_bad ("condition code value (%d) too large", number);
1029      ignore_rest_of_line ();
1030      free (name);
1031      return;
1032    }
1033
1034  ext_oper = (struct arc_ext_operand_value *) \
1035    xmalloc (sizeof (struct arc_ext_operand_value));
1036
1037  if (opertype)
1038    {
1039      /* If the symbol already exists, point it at the new definition.  */
1040      if ((symbolP = symbol_find (name)))
1041	{
1042	  if (S_GET_SEGMENT (symbolP) == reg_section)
1043	    S_SET_VALUE (symbolP, (int) &ext_oper->operand);
1044	  else
1045	    {
1046	      as_bad ("attempt to override symbol: %s", name);
1047	      ignore_rest_of_line ();
1048	      free (name);
1049	      free (ext_oper);
1050	      return;
1051	    }
1052	}
1053      else
1054	{
1055	  /* If its not there, add it.  */
1056	  symbol_table_insert (symbol_create (name, reg_section,
1057					      (int) &ext_oper->operand, &zero_address_frag));
1058	}
1059    }
1060
1061  ext_oper->operand.name  = name;
1062  ext_oper->operand.value = number;
1063  ext_oper->operand.type  = arc_operand_type (opertype);
1064  ext_oper->operand.flags = imode;
1065
1066  ext_oper->next = arc_ext_operands;
1067  arc_ext_operands = ext_oper;
1068
1069  /* OK, now that we know what this operand is, put a description in
1070     the arc extension section of the output file.  */
1071
1072  old_sec    = now_seg;
1073  old_subsec = now_subseg;
1074
1075  arc_set_ext_seg ();
1076
1077  switch (opertype)
1078    {
1079    case 0:
1080      p = frag_more (1);
1081      *p = 3 + strlen (name) + 1;
1082      p = frag_more (1);
1083      *p = EXT_COND_CODE;
1084      p = frag_more (1);
1085      *p = number;
1086      p = frag_more (strlen (name) + 1);
1087      strcpy (p, name);
1088      break;
1089    case 1:
1090      p = frag_more (1);
1091      *p = 3 + strlen (name) + 1;
1092      p = frag_more (1);
1093      *p = EXT_CORE_REGISTER;
1094      p = frag_more (1);
1095      *p = number;
1096      p = frag_more (strlen (name) + 1);
1097      strcpy (p, name);
1098      break;
1099    case 2:
1100      p = frag_more (1);
1101      *p = 6 + strlen (name) + 1;
1102      p = frag_more (1);
1103      *p = EXT_AUX_REGISTER;
1104      p = frag_more (1);
1105      *p = number >> 24 & 0xff;
1106      p = frag_more (1);
1107      *p = number >> 16 & 0xff;
1108      p = frag_more (1);
1109      *p = number >>  8 & 0xff;
1110      p = frag_more (1);
1111      *p = number       & 0xff;
1112      p = frag_more (strlen (name) + 1);
1113      strcpy (p, name);
1114      break;
1115    default:
1116      as_bad ("invalid opertype");
1117      ignore_rest_of_line ();
1118      free (name);
1119      return;
1120      break;
1121    }
1122
1123  subseg_set (old_sec, old_subsec);
1124
1125  /* Enter all registers into the symbol table.  */
1126
1127  demand_empty_rest_of_line ();
1128}
1129
1130static void
1131arc_extinst (ignore)
1132     int ignore ATTRIBUTE_UNUSED;
1133{
1134  unsigned char syntax[129];
1135  char *name;
1136  char *p;
1137  char c;
1138  int suffixcode = -1;
1139  int opcode, subopcode;
1140  int i;
1141  int class = 0;
1142  int name_len;
1143  struct arc_opcode *ext_op;
1144
1145  segT old_sec;
1146  int old_subsec;
1147
1148  name = input_line_pointer;
1149  c = get_symbol_end ();
1150  name = xstrdup (name);
1151  strcpy (syntax, name);
1152  name_len = strlen (name);
1153
1154  /* just after name is now '\0'  */
1155  p = input_line_pointer;
1156  *p = c;
1157
1158  SKIP_WHITESPACE ();
1159
1160  if (*input_line_pointer != ',')
1161    {
1162      as_bad ("expected comma after operand name");
1163      ignore_rest_of_line ();
1164      return;
1165    }
1166
1167  input_line_pointer++;		/* skip ','  */
1168  opcode = get_absolute_expression ();
1169
1170  SKIP_WHITESPACE ();
1171
1172  if (*input_line_pointer != ',')
1173    {
1174      as_bad ("expected comma after opcode");
1175      ignore_rest_of_line ();
1176      return;
1177    }
1178
1179  input_line_pointer++;		/* skip ','  */
1180  subopcode = get_absolute_expression ();
1181
1182  if (subopcode < 0)
1183    {
1184      as_bad ("negative subopcode %d", subopcode);
1185      ignore_rest_of_line ();
1186      return;
1187    }
1188
1189  if (subopcode)
1190    {
1191      if (3 != opcode)
1192	{
1193	  as_bad ("subcode value found when opcode not equal 0x03");
1194	  ignore_rest_of_line ();
1195	  return;
1196	}
1197      else
1198	{
1199	  if (subopcode < 0x09 || subopcode == 0x3f)
1200	    {
1201	      as_bad ("invalid subopcode %d", subopcode);
1202	      ignore_rest_of_line ();
1203	      return;
1204	    }
1205	}
1206    }
1207
1208  SKIP_WHITESPACE ();
1209
1210  if (*input_line_pointer != ',')
1211    {
1212      as_bad ("expected comma after subopcode");
1213      ignore_rest_of_line ();
1214      return;
1215    }
1216
1217  input_line_pointer++;		/* skip ','  */
1218
1219  for (i = 0; i < (int) MAXSUFFIXCLASS; i++)
1220    {
1221      if (!strncmp (suffixclass[i].name,input_line_pointer, suffixclass[i].len))
1222	{
1223	  suffixcode = i;
1224	  input_line_pointer += suffixclass[i].len;
1225	  break;
1226	}
1227    }
1228
1229  if (-1 == suffixcode)
1230    {
1231      as_bad ("invalid suffix class");
1232      ignore_rest_of_line ();
1233      return;
1234    }
1235
1236  SKIP_WHITESPACE ();
1237
1238  if (*input_line_pointer != ',')
1239    {
1240      as_bad ("expected comma after suffix class");
1241      ignore_rest_of_line ();
1242      return;
1243    }
1244
1245  input_line_pointer++;		/* skip ','  */
1246
1247  for (i = 0; i < (int) MAXSYNTAXCLASS; i++)
1248    {
1249      if (!strncmp (syntaxclass[i].name,input_line_pointer, syntaxclass[i].len))
1250	{
1251	  class = syntaxclass[i].class;
1252	  input_line_pointer += syntaxclass[i].len;
1253	  break;
1254	}
1255    }
1256
1257  if (0 == (SYNTAX_VALID & class))
1258    {
1259      as_bad ("invalid syntax class");
1260      ignore_rest_of_line ();
1261      return;
1262    }
1263
1264  if ((0x3 == opcode) & (class & SYNTAX_3OP))
1265    {
1266      as_bad ("opcode 0x3 and SYNTAX_3OP invalid");
1267      ignore_rest_of_line ();
1268      return;
1269    }
1270
1271  switch (suffixcode)
1272    {
1273    case 0:
1274      strcat (syntax, "%.q%.f ");
1275      break;
1276    case 1:
1277      strcat (syntax, "%.f ");
1278      break;
1279    case 2:
1280      strcat (syntax, "%.q ");
1281      break;
1282    case 3:
1283      strcat (syntax, " ");
1284      break;
1285    default:
1286      as_bad ("unknown suffix class");
1287      ignore_rest_of_line ();
1288      return;
1289      break;
1290    };
1291
1292  strcat (syntax, ((opcode == 0x3) ? "%a,%b" : ((class & SYNTAX_3OP) ? "%a,%b,%c" : "%b,%c")));
1293  if (suffixcode < 2)
1294    strcat (syntax, "%F");
1295  strcat (syntax, "%S%L");
1296
1297  ext_op = (struct arc_opcode *) xmalloc (sizeof (struct arc_opcode));
1298  ext_op->syntax = xstrdup (syntax);
1299
1300  ext_op->mask  = I (-1) | ((0x3 == opcode) ? C (-1) : 0);
1301  ext_op->value = I (opcode) | ((0x3 == opcode) ? C (subopcode) : 0);
1302  ext_op->flags = class;
1303  ext_op->next_asm = arc_ext_opcodes;
1304  ext_op->next_dis = arc_ext_opcodes;
1305  arc_ext_opcodes = ext_op;
1306
1307  /* OK, now that we know what this inst is, put a description in the
1308     arc extension section of the output file.  */
1309
1310  old_sec    = now_seg;
1311  old_subsec = now_subseg;
1312
1313  arc_set_ext_seg ();
1314
1315  p = frag_more (1);
1316  *p = 5 + name_len + 1;
1317  p = frag_more (1);
1318  *p = EXT_INSTRUCTION;
1319  p = frag_more (1);
1320  *p = opcode;
1321  p = frag_more (1);
1322  *p = subopcode;
1323  p = frag_more (1);
1324  *p = (class & (OP1_MUST_BE_IMM | OP1_IMM_IMPLIED) ? IGNORE_FIRST_OPD : 0);
1325  p = frag_more (name_len);
1326  strncpy (p, syntax, name_len);
1327  p = frag_more (1);
1328  *p = '\0';
1329
1330  subseg_set (old_sec, old_subsec);
1331
1332  demand_empty_rest_of_line ();
1333}
1334
1335int
1336arc_set_ext_seg ()
1337{
1338  if (!arcext_section)
1339    {
1340      arcext_section = subseg_new (".arcextmap", 0);
1341      bfd_set_section_flags (stdoutput, arcext_section,
1342			     SEC_READONLY | SEC_HAS_CONTENTS);
1343    }
1344  else
1345    subseg_set (arcext_section, 0);
1346  return 1;
1347}
1348
1349static void
1350arc_common (localScope)
1351     int localScope;
1352{
1353  char *name;
1354  char c;
1355  char *p;
1356  int align, size;
1357  symbolS *symbolP;
1358
1359  name = input_line_pointer;
1360  c = get_symbol_end ();
1361  /* just after name is now '\0'  */
1362  p = input_line_pointer;
1363  *p = c;
1364  SKIP_WHITESPACE ();
1365
1366  if (*input_line_pointer != ',')
1367    {
1368      as_bad ("expected comma after symbol name");
1369      ignore_rest_of_line ();
1370      return;
1371    }
1372
1373  input_line_pointer++;		/* skip ','  */
1374  size = get_absolute_expression ();
1375
1376  if (size < 0)
1377    {
1378      as_bad ("negative symbol length");
1379      ignore_rest_of_line ();
1380      return;
1381    }
1382
1383  *p = 0;
1384  symbolP = symbol_find_or_make (name);
1385  *p = c;
1386
1387  if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1388    {
1389      as_bad ("ignoring attempt to re-define symbol");
1390      ignore_rest_of_line ();
1391      return;
1392    }
1393  if (((int) S_GET_VALUE (symbolP) != 0) \
1394      && ((int) S_GET_VALUE (symbolP) != size))
1395    {
1396      as_warn ("length of symbol \"%s\" already %ld, ignoring %d",
1397	       S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
1398    }
1399  assert (symbolP->sy_frag == &zero_address_frag);
1400
1401  /* Now parse the alignment field.  This field is optional for
1402     local and global symbols. Default alignment is zero.  */
1403  if (*input_line_pointer == ',')
1404    {
1405      input_line_pointer++;
1406      align = get_absolute_expression ();
1407      if (align < 0)
1408	{
1409	  align = 0;
1410	  as_warn ("assuming symbol alignment of zero");
1411	}
1412    }
1413  else
1414    align = 0;
1415
1416  if (localScope != 0)
1417    {
1418      segT old_sec;
1419      int old_subsec;
1420      char *pfrag;
1421
1422      old_sec    = now_seg;
1423      old_subsec = now_subseg;
1424      record_alignment (bss_section, align);
1425      subseg_set (bss_section, 0);  /* ??? subseg_set (bss_section, 1); ???  */
1426
1427      if (align)
1428	/* Do alignment.  */
1429	frag_align (align, 0, 0);
1430
1431      /* Detach from old frag.  */
1432      if (S_GET_SEGMENT (symbolP) == bss_section)
1433	symbolP->sy_frag->fr_symbol = NULL;
1434
1435      symbolP->sy_frag = frag_now;
1436      pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
1437			(offsetT) size, (char *) 0);
1438      *pfrag = 0;
1439
1440      S_SET_SIZE       (symbolP, size);
1441      S_SET_SEGMENT    (symbolP, bss_section);
1442      S_CLEAR_EXTERNAL (symbolP);
1443      symbolP->local = 1;
1444      subseg_set (old_sec, old_subsec);
1445    }
1446  else
1447    {
1448      S_SET_VALUE    (symbolP, (valueT) size);
1449      S_SET_ALIGN    (symbolP, align);
1450      S_SET_EXTERNAL (symbolP);
1451      S_SET_SEGMENT  (symbolP, bfd_com_section_ptr);
1452    }
1453
1454  symbolP->bsym->flags |= BSF_OBJECT;
1455
1456  demand_empty_rest_of_line ();
1457}
1458
1459/* Select the cpu we're assembling for.  */
1460
1461static void
1462arc_option (ignore)
1463     int ignore ATTRIBUTE_UNUSED;
1464{
1465  int mach;
1466  char c;
1467  char *cpu;
1468
1469  cpu = input_line_pointer;
1470  c = get_symbol_end ();
1471  mach = arc_get_mach (cpu);
1472  *input_line_pointer = c;
1473
1474  /* If an instruction has already been seen, it's too late.  */
1475  if (cpu_tables_init_p)
1476    {
1477      as_bad ("\".option\" directive must appear before any instructions");
1478      ignore_rest_of_line ();
1479      return;
1480    }
1481
1482  if (mach == -1)
1483    goto bad_cpu;
1484
1485  if (mach_type_specified_p && mach != arc_mach_type)
1486    {
1487      as_bad ("\".option\" directive conflicts with initial definition");
1488      ignore_rest_of_line ();
1489      return;
1490    }
1491  else
1492    {
1493      /* The cpu may have been selected on the command line.  */
1494      if (mach != arc_mach_type)
1495	as_warn ("\".option\" directive overrides command-line (default) value");
1496      arc_mach_type = mach;
1497      if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
1498	as_fatal ("could not set architecture and machine");
1499      mach_type_specified_p = 1;
1500    }
1501  demand_empty_rest_of_line ();
1502  return;
1503
1504 bad_cpu:
1505  as_bad ("invalid identifier for \".option\"");
1506  ignore_rest_of_line ();
1507}
1508
1509/* Turn a string in input_line_pointer into a floating point constant
1510   of type TYPE, and store the appropriate bytes in *LITP.  The number
1511   of LITTLENUMS emitted is stored in *SIZEP.  An error message is
1512   returned, or NULL on OK.  */
1513
1514/* Equal to MAX_PRECISION in atof-ieee.c  */
1515#define MAX_LITTLENUMS 6
1516
1517char *
1518md_atof (type, litP, sizeP)
1519     int type;
1520     char *litP;
1521     int *sizeP;
1522{
1523  int prec;
1524  LITTLENUM_TYPE words[MAX_LITTLENUMS];
1525  LITTLENUM_TYPE *wordP;
1526  char *t;
1527
1528  switch (type)
1529    {
1530    case 'f':
1531    case 'F':
1532      prec = 2;
1533      break;
1534
1535    case 'd':
1536    case 'D':
1537      prec = 4;
1538      break;
1539
1540    default:
1541      *sizeP = 0;
1542      return "bad call to md_atof";
1543    }
1544
1545  t = atof_ieee (input_line_pointer, type, words);
1546  if (t)
1547    input_line_pointer = t;
1548  *sizeP = prec * sizeof (LITTLENUM_TYPE);
1549  for (wordP = words; prec--;)
1550    {
1551      md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
1552      litP += sizeof (LITTLENUM_TYPE);
1553    }
1554
1555  return NULL;
1556}
1557
1558/* Write a value out to the object file, using the appropriate
1559   endianness.  */
1560
1561void
1562md_number_to_chars (buf, val, n)
1563     char *buf;
1564     valueT val;
1565     int n;
1566{
1567  if (target_big_endian)
1568    number_to_chars_bigendian (buf, val, n);
1569  else
1570    number_to_chars_littleendian (buf, val, n);
1571}
1572
1573/* Round up a section size to the appropriate boundary.  */
1574
1575valueT
1576md_section_align (segment, size)
1577     segT segment;
1578     valueT size;
1579{
1580  int align = bfd_get_section_alignment (stdoutput, segment);
1581
1582  return ((size + (1 << align) - 1) & (-1 << align));
1583}
1584
1585/* We don't have any form of relaxing.  */
1586
1587int
1588md_estimate_size_before_relax (fragp, seg)
1589     fragS *fragp ATTRIBUTE_UNUSED;
1590     asection *seg ATTRIBUTE_UNUSED;
1591{
1592  as_fatal (_("md_estimate_size_before_relax\n"));
1593  return 1;
1594}
1595
1596/* Convert a machine dependent frag.  We never generate these.  */
1597
1598void
1599md_convert_frag (abfd, sec, fragp)
1600     bfd *abfd ATTRIBUTE_UNUSED;
1601     asection *sec ATTRIBUTE_UNUSED;
1602     fragS *fragp ATTRIBUTE_UNUSED;
1603{
1604  as_fatal (_("md_convert_frag\n"));
1605}
1606
1607void
1608arc_code_symbol (expressionP)
1609     expressionS *expressionP;
1610{
1611  if (expressionP->X_op == O_symbol && expressionP->X_add_number == 0)
1612    {
1613      expressionS two;
1614      expressionP->X_op = O_right_shift;
1615      expressionP->X_add_symbol->sy_value.X_op = O_constant;
1616      two.X_op = O_constant;
1617      two.X_add_symbol = two.X_op_symbol = NULL;
1618      two.X_add_number = 2;
1619      expressionP->X_op_symbol = make_expr_symbol (&two);
1620    }
1621  /* Allow %st(sym1-sym2)  */
1622  else if (expressionP->X_op == O_subtract
1623	   && expressionP->X_add_symbol != NULL
1624	   && expressionP->X_op_symbol != NULL
1625	   && expressionP->X_add_number == 0)
1626    {
1627      expressionS two;
1628      expressionP->X_add_symbol = make_expr_symbol (expressionP);
1629      expressionP->X_op = O_right_shift;
1630      two.X_op = O_constant;
1631      two.X_add_symbol = two.X_op_symbol = NULL;
1632      two.X_add_number = 2;
1633      expressionP->X_op_symbol = make_expr_symbol (&two);
1634    }
1635  else
1636    {
1637      as_bad ("expression too complex code symbol");
1638      return;
1639    }
1640}
1641
1642/* Parse an operand that is machine-specific.
1643
1644   The ARC has a special %-op to adjust addresses so they're usable in
1645   branches.  The "st" is short for the STatus register.
1646   ??? Later expand this to take a flags value too.
1647
1648   ??? We can't create new expression types so we map the %-op's onto the
1649   existing syntax.  This means that the user could use the chosen syntax
1650   to achieve the same effect.  */
1651
1652void
1653md_operand (expressionP)
1654     expressionS *expressionP;
1655{
1656  char *p = input_line_pointer;
1657
1658  if (*p == '%')
1659    if (strncmp (p, "%st(", 4) == 0)
1660      {
1661	input_line_pointer += 4;
1662	expression (expressionP);
1663	if (*input_line_pointer != ')')
1664	  {
1665	    as_bad ("missing ')' in %%-op");
1666	    return;
1667	  }
1668	++input_line_pointer;
1669	arc_code_symbol (expressionP);
1670      }
1671    else
1672      {
1673	/* It could be a register.  */
1674	int i, l;
1675	struct arc_ext_operand_value *ext_oper = arc_ext_operands;
1676	p++;
1677
1678	while (ext_oper)
1679	  {
1680	    l = strlen (ext_oper->operand.name);
1681	    if (!strncmp (p, ext_oper->operand.name, l) && !ISALNUM (*(p + l)))
1682	      {
1683		input_line_pointer += l + 1;
1684		expressionP->X_op = O_register;
1685		expressionP->X_add_number = (int) &ext_oper->operand;
1686		return;
1687	      }
1688	    ext_oper = ext_oper->next;
1689	  }
1690	for (i = 0; i < arc_reg_names_count; i++)
1691	  {
1692	    l = strlen (arc_reg_names[i].name);
1693	    if (!strncmp (p, arc_reg_names[i].name, l) && !ISALNUM (*(p + l)))
1694	      {
1695		input_line_pointer += l + 1;
1696		expressionP->X_op = O_register;
1697		expressionP->X_add_number = (int) &arc_reg_names[i];
1698		break;
1699	      }
1700	  }
1701      }
1702}
1703
1704/* We have no need to default values of symbols.
1705   We could catch register names here, but that is handled by inserting
1706   them all in the symbol table to begin with.  */
1707
1708symbolS *
1709md_undefined_symbol (name)
1710     char *name ATTRIBUTE_UNUSED;
1711{
1712  return 0;
1713}
1714
1715/* Functions concerning expressions.  */
1716
1717/* Parse a .byte, .word, etc. expression.
1718
1719   Values for the status register are specified with %st(label).
1720   `label' will be right shifted by 2.  */
1721
1722void
1723arc_parse_cons_expression (exp, nbytes)
1724     expressionS *exp;
1725     unsigned int nbytes ATTRIBUTE_UNUSED;
1726{
1727  char *p = input_line_pointer;
1728  int code_symbol_fix = 0;
1729
1730  for (; ! is_end_of_line[(unsigned char) *p]; p++)
1731    if (*p == '@' && !strncmp (p, "@h30", 4))
1732      {
1733	code_symbol_fix = 1;
1734	strcpy (p, ";   ");
1735      }
1736  expr (0, exp);
1737  if (code_symbol_fix)
1738    {
1739      arc_code_symbol (exp);
1740      input_line_pointer = p;
1741    }
1742}
1743
1744/* Record a fixup for a cons expression.  */
1745
1746void
1747arc_cons_fix_new (frag, where, nbytes, exp)
1748     fragS *frag;
1749     int where;
1750     int nbytes;
1751     expressionS *exp;
1752{
1753  if (nbytes == 4)
1754    {
1755      int reloc_type;
1756      expressionS exptmp;
1757
1758      /* This may be a special ARC reloc (eg: %st()).  */
1759      reloc_type = get_arc_exp_reloc_type (1, BFD_RELOC_32, exp, &exptmp);
1760      fix_new_exp (frag, where, nbytes, &exptmp, 0, reloc_type);
1761    }
1762  else
1763    {
1764      fix_new_exp (frag, where, nbytes, exp, 0,
1765		   nbytes == 2 ? BFD_RELOC_16
1766		   : nbytes == 8 ? BFD_RELOC_64
1767		   : BFD_RELOC_32);
1768    }
1769}
1770
1771/* Functions concerning relocs.  */
1772
1773/* The location from which a PC relative jump should be calculated,
1774   given a PC relative reloc.  */
1775
1776long
1777md_pcrel_from (fixP)
1778     fixS *fixP;
1779{
1780  /* Return the address of the delay slot.  */
1781  return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size;
1782}
1783
1784/* Compute the reloc type of an expression.
1785   The possibly modified expression is stored in EXPNEW.
1786
1787   This is used to convert the expressions generated by the %-op's into
1788   the appropriate operand type.  It is called for both data in instructions
1789   (operands) and data outside instructions (variables, debugging info, etc.).
1790
1791   Currently supported %-ops:
1792
1793   %st(symbol): represented as "symbol >> 2"
1794                "st" is short for STatus as in the status register (pc)
1795
1796   DEFAULT_TYPE is the type to use if no special processing is required.
1797
1798   DATA_P is non-zero for data or limm values, zero for insn operands.
1799   Remember that the opcode "insertion fns" cannot be used on data, they're
1800   only for inserting operands into insns.  They also can't be used for limm
1801   values as the insertion routines don't handle limm values.  When called for
1802   insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED).  When
1803   called for data or limm values we use real reloc types.  */
1804
1805static int
1806get_arc_exp_reloc_type (data_p, default_type, exp, expnew)
1807     int data_p;
1808     int default_type;
1809     expressionS *exp;
1810     expressionS *expnew;
1811{
1812  /* If the expression is "symbol >> 2" we must change it to just "symbol",
1813     as fix_new_exp can't handle it.  Similarly for (symbol - symbol) >> 2.
1814     That's ok though.  What's really going on here is that we're using
1815     ">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26.  */
1816
1817  if (exp->X_op == O_right_shift
1818      && exp->X_op_symbol != NULL
1819      && exp->X_op_symbol->sy_value.X_op == O_constant
1820      && exp->X_op_symbol->sy_value.X_add_number == 2
1821      && exp->X_add_number == 0)
1822    {
1823      if (exp->X_add_symbol != NULL
1824	  && (exp->X_add_symbol->sy_value.X_op == O_constant
1825	      || exp->X_add_symbol->sy_value.X_op == O_symbol))
1826	{
1827	  *expnew = *exp;
1828	  expnew->X_op = O_symbol;
1829	  expnew->X_op_symbol = NULL;
1830	  return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1831	}
1832      else if (exp->X_add_symbol != NULL
1833	       && exp->X_add_symbol->sy_value.X_op == O_subtract)
1834	{
1835	  *expnew = exp->X_add_symbol->sy_value;
1836	  return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1837	}
1838    }
1839
1840  *expnew = *exp;
1841  return default_type;
1842}
1843
1844/* Apply a fixup to the object code.  This is called for all the
1845   fixups we generated by the call to fix_new_exp, above.  In the call
1846   above we used a reloc code which was the largest legal reloc code
1847   plus the operand index.  Here we undo that to recover the operand
1848   index.  At this point all symbol values should be fully resolved,
1849   and we attempt to completely resolve the reloc.  If we can not do
1850   that, we determine the correct reloc code and put it back in the fixup.  */
1851
1852void
1853md_apply_fix3 (fixP, valP, seg)
1854     fixS *fixP;
1855     valueT * valP;
1856     segT seg;
1857{
1858#if 0
1859  char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1860#endif
1861  valueT value = * valP;
1862
1863  if (fixP->fx_addsy == (symbolS *) NULL)
1864    fixP->fx_done = 1;
1865
1866  else if (fixP->fx_pcrel)
1867    {
1868      /* Hack around bfd_install_relocation brain damage.  */
1869      if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
1870	value += md_pcrel_from (fixP);
1871    }
1872
1873  /* We can't actually support subtracting a symbol.  */
1874  if (fixP->fx_subsy != NULL)
1875    as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1876
1877  if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1878    {
1879      int opindex;
1880      const struct arc_operand *operand;
1881      char *where;
1882      arc_insn insn;
1883
1884      opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1885
1886      operand = &arc_operands[opindex];
1887
1888      /* Fetch the instruction, insert the fully resolved operand
1889	 value, and stuff the instruction back again.  */
1890      where = fixP->fx_frag->fr_literal + fixP->fx_where;
1891      if (target_big_endian)
1892	insn = bfd_getb32 ((unsigned char *) where);
1893      else
1894	insn = bfd_getl32 ((unsigned char *) where);
1895      insn = arc_insert_operand (insn, operand, -1, NULL, (offsetT) value,
1896				 fixP->fx_file, fixP->fx_line);
1897      if (target_big_endian)
1898	bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1899      else
1900	bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
1901
1902      if (fixP->fx_done)
1903	{
1904	  /* Nothing else to do here.  */
1905	  return;
1906	}
1907
1908      /* Determine a BFD reloc value based on the operand information.
1909	 We are only prepared to turn a few of the operands into relocs.
1910	 !!! Note that we can't handle limm values here.  Since we're using
1911	 implicit addends the addend must be inserted into the instruction,
1912	 however, the opcode insertion routines currently do nothing with
1913	 limm values.  */
1914      if (operand->fmt == 'B')
1915	{
1916	  assert ((operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0
1917		  && operand->bits == 20
1918		  && operand->shift == 7);
1919	  fixP->fx_r_type = BFD_RELOC_ARC_B22_PCREL;
1920	}
1921      else if (operand->fmt == 'J')
1922	{
1923	  assert ((operand->flags & ARC_OPERAND_ABSOLUTE_BRANCH) != 0
1924		  && operand->bits == 24
1925		  && operand->shift == 32);
1926	  fixP->fx_r_type = BFD_RELOC_ARC_B26;
1927	}
1928      else if (operand->fmt == 'L')
1929	{
1930	  assert ((operand->flags & ARC_OPERAND_LIMM) != 0
1931		  && operand->bits == 32
1932		  && operand->shift == 32);
1933	  fixP->fx_r_type = BFD_RELOC_32;
1934	}
1935      else
1936	{
1937	  as_bad_where (fixP->fx_file, fixP->fx_line,
1938			"unresolved expression that must be resolved");
1939	  fixP->fx_done = 1;
1940	  return;
1941	}
1942    }
1943  else
1944    {
1945      switch (fixP->fx_r_type)
1946	{
1947	case BFD_RELOC_8:
1948	  md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1949			      value, 1);
1950	  break;
1951	case BFD_RELOC_16:
1952	  md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1953			      value, 2);
1954	  break;
1955	case BFD_RELOC_32:
1956	  md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1957			      value, 4);
1958	  break;
1959#if 0
1960	case BFD_RELOC_64:
1961	  md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1962			      value, 8);
1963	  break;
1964#endif
1965	case BFD_RELOC_ARC_B26:
1966	  /* If !fixP->fx_done then `value' is an implicit addend.
1967	     We must shift it right by 2 in this case as well because the
1968	     linker performs the relocation and then adds this in (as opposed
1969	     to adding this in and then shifting right by 2).  */
1970	  value >>= 2;
1971	  md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1972			      value, 4);
1973	  break;
1974	default:
1975	  abort ();
1976	}
1977    }
1978}
1979
1980/* Translate internal representation of relocation info to BFD target
1981   format.  */
1982
1983arelent *
1984tc_gen_reloc (section, fixP)
1985     asection *section ATTRIBUTE_UNUSED;
1986     fixS *fixP;
1987{
1988  arelent *reloc;
1989
1990  reloc = (arelent *) xmalloc (sizeof (arelent));
1991
1992  reloc->sym_ptr_ptr = &fixP->fx_addsy->bsym;
1993  reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
1994  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
1995  if (reloc->howto == (reloc_howto_type *) NULL)
1996    {
1997      as_bad_where (fixP->fx_file, fixP->fx_line,
1998		    "internal error: can't export reloc type %d (`%s')",
1999		    fixP->fx_r_type,
2000		    bfd_get_reloc_code_name (fixP->fx_r_type));
2001      return NULL;
2002    }
2003
2004  assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
2005
2006  /* Set addend to account for PC being advanced one insn before the
2007     target address is computed.  */
2008
2009  reloc->addend = (fixP->fx_pcrel ? -4 : 0);
2010
2011  return reloc;
2012}
2013